package com.sweetcircle.config;


import com.sweetcircle.exception.BusinessException;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.io.File;

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {

    private String staticResourceLocation = System.getProperty("user.dir") + "\\file\\static";

    /**
     * 用于配置 Spring MVC 的拦截器的。它的作用是拦截所有请求，并对请求进行一些处理，如：日志记录、权限校验等。
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor())  // 添加一个拦截器
                .addPathPatterns("/**")  // 拦截所有请求
                .excludePathPatterns("/static/**");  // 排除请求
    }


    /**
     * springboot 2.0配置WebMvcConfigurationSupport之后，会导致默认配置被覆盖，要访问静态资源需要重写addResourceHandlers方法
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        File file = new File(staticResourceLocation);
        if (!file.exists()) {
            boolean mkdir = file.mkdirs();
            if (!mkdir) {
                throw new BusinessException("创建文件夹失败，请在项目根路径下创建目录 file/static");
            }
        }
        registry.addResourceHandler("static/**")  // 对所有的 URL 进行静态资源映射的配置；
                .addResourceLocations("file:" + staticResourceLocation + File.separator);  // 表示将静态资源文件路径设置为 classpath:/static/，即在 classpath 路径下的 static 文件夹中。这里可以配置多个静态资源文件夹路径，用逗号隔开即可。
    }


    // 设置跨域请求
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  //所有的 URL 进行跨域资源共享的配置；
                .allowedOrigins("*")   //允许来自任何来源（包括不同域名、端口或协议）的请求访问资源；
                .allowedHeaders("*")   //允许的请求头，这里设置为 "*" 表示允许所有请求头；
                .allowedMethods("*")   //允许的请求方法，这里设置为 "*" 表示允许所有 HTTP 方法；
                .maxAge(24 * 60 * 60); //响应的最大时长，这里设置为 24 小时。
    }
}
